package ar.com.tallerdos.smartdinner.gson.serializer;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.util.Log;
import ar.com.tallerdos.smartdinner.model.Comida;
import ar.com.tallerdos.smartdinner.model.Comida.ComidaEstado;
import ar.com.tallerdos.smartdinner.model.Descuento;
import ar.com.tallerdos.smartdinner.model.Mesa;
import ar.com.tallerdos.smartdinner.model.Pedido;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken;

public class ComidaCustomSerializer implements JsonDeserializer<Comida> {

    @SuppressLint("SimpleDateFormat")
    @SuppressWarnings("unchecked")
    @Override
    public Comida deserialize(JsonElement json, Type arg1,
	    JsonDeserializationContext context) throws JsonParseException {
	JsonObject jo = (JsonObject) json;
	
	Comida comida = new Comida();
	comida.setCodigo(jo.get("id").getAsInt());
	try {
	    comida.setHoraInicio(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(jo.get("fecha").getAsString()));
	} catch (ParseException e) {
	    e.printStackTrace();
	    Log.e(this.getClass().getCanonicalName(), "Error al parsear la hora de la comida");
	}
	comida.setCantidadComensales(jo.get("cant_clientes").getAsInt());
	comida.setCerrado(intToBool(jo.get("cerrado").getAsInt()));
	comida.setFacturado(intToBool(jo.get("facturado").getAsInt()));
	comida.setFacturaEntregada(intToBool(jo.get("factura_entregada").getAsInt()));
	
	
	comida.setMesas((List<Mesa>) context.deserialize(jo.get("mesas"), new TypeToken<List<Mesa>>() { }.getType()));
	
	comida.setPedidos((List<Pedido>) context.deserialize(jo.get("pedidos"), new TypeToken<List<Pedido>>() { }.getType()));
	if (comida.getPedidos() != null) {
	    for (Pedido p : comida.getPedidos()) {
		p.setComida(comida);
	    }
	} else {
	    comida.setPedidos(new ArrayList<Pedido>());
	}
	if (jo.get("facturado").getAsString().equals("0") && jo.get("cancelado").getAsString().equals("0")) {
	    comida.setEstado(ComidaEstado.ABIERTA);
	} else {
	    comida.setEstado(ComidaEstado.CERRADA);
	}
	
	comida.setDescuento((Descuento) context.deserialize(jo.get("descuento"), new TypeToken<Descuento>() { }.getType()));
	
	return comida;
    }
    
    private Boolean intToBool(int valor) {
	if (valor == 0) {
	    return false;
	} else {
	    return true;
	}
    }

}
